#include "../include/myls_head.h"

# include "mycp.c"
void usage(char *name)
{
    printf("Usage:%s [option]...[file]...\n\n", name);
    printf("-al do not ignore entries starting with .\n");
    printf("-l use a long listing format\n\n");
}
typedef struct three_para
{
       char *  para1;//参数1
       char *  para2;//参数2   
       char *  para3;//参数2   
}three_para;

int  myls(char * paras){
    char * mode, *lsDir,*originDir;
    three_para *fparas = (three_para *)paras;
    mode = fparas->para1;
    lsDir = fparas->para2;
    originDir = fparas->para3;
    // 暂时只支持 '-l' ,'-al'两种参数
    if (!(strcmp( mode,"-l")==0||strcmp( mode,"-al")==0))
    {
        usage("myls");
        return 0;
    }
    
    DIR  *openDir = opendir(lsDir);
    //判断是否打开文件成功
    if(openDir==NULL){
        printf("open directory failed !\n");
        return 0;
    }
    else{//成功打开后
        //统一mycp的粘贴目录
         char pasteDir[] = {"/home/ljy/tmpfile"};
         // paste文件夹不存在则创建文件夹
         if (access(pasteDir, 0) == -1)
             {
             mkdir(pasteDir,0755);
            printf("创建paste文件夹:\33[1m\33[34m %s\33[0m \n",pasteDir);
         }
        // 读取目录文件的内容
        while (NULL!=(dirAttribute = readdir(openDir)))
        {
            /***处理myls的参数***/
            if (strcmp( mode,"-al")==0)
            {
                ;//执行后面所有代码
            }
            else if (strcmp( mode,"-l")==0)
            {
                /*不显示 .开头的文件 */
                if(dirAttribute->d_name[0]=='.'){
                    continue;
                }
            }
            
            //1:文件类型
            // (dirAttribute->d_type)==4?printf("d"):  printf("-");
            char temp1[256];//存放目录
            strcpy(temp1,lsDir);
            char temp2[256]="/";//开辟一个空间，用于拼接文件名
            char   *filepath=strcat(temp1,strcat( temp2,dirAttribute->d_name));//拼接得到完整目录，存入temp1中
            if(lstat(filepath,&stateAttribute)<0){
                printf("lstate error!\n");
                continue;
            }else{
                // 2:输出所有者权限
                /*
                (S_IRUSR&stateAttribute.st_mode)==S_IRUSR?printf("r") :  printf("-");
                (S_IWUSR&stateAttribute.st_mode)==S_IWUSR?printf("w") :  printf("-");
                (S_IXUSR&stateAttribute.st_mode)==S_IXUSR?printf("x") :  printf("-");
                // 3:输出所有者组权限
                (S_IRGRP&stateAttribute.st_mode)==S_IRGRP?printf("r") :  printf("-");
                (S_IWGRP&stateAttribute.st_mode)==S_IWGRP?printf("w") :  printf("-");
                (S_IXGRP&stateAttribute.st_mode)==S_IXGRP?printf("x") :  printf("-");
                // 4:输出其他所有者权限
                (S_IROTH&stateAttribute.st_mode)==S_IROTH?printf("r") :  printf("-");
                (S_IWOTH&stateAttribute.st_mode)==S_IWOTH?printf("w") :  printf("-");
                (S_IXOTH&stateAttribute.st_mode)==S_IXOTH?printf("x") :  printf("-");
                

                // 5：获取这个文件的硬链接数
                printf( " %d",stateAttribute.st_nlink);
                // 6：获取这个文件的用户属性
                pwd = getpwuid(stateAttribute.st_uid);
                printf(" %s",pwd->pw_name);
                // 7：获取这个文件的用户组属性
                grp = getgrgid(stateAttribute.st_gid);
                printf(" %s",grp->gr_name);
                // 8：文件大小
                printf(" %6d",stateAttribute.st_size);
                // 9:文件最后修改时间
                char buffer[24];
                struct tm *  timeinfo = localtime (&stateAttribute.st_mtime);
                strftime(buffer, 24, "%m月  %d %H:%M", timeinfo);
                printf(" %s",buffer);
                */
                // 10:输出文件(夹)名称
                /*********************************************/
                // 获取相对路径
                char rPath[128]={0};
                char abPath[128]={0};
                strcpy(abPath,lsDir);
                strcat(strcat(abPath,"/"),dirAttribute->d_name);
                strncpy(rPath , abPath +strlen(originDir) , strlen(abPath)-strlen(originDir));
                // 10.1目录文件
                if (S_ISDIR(stateAttribute.st_mode))
                {
                    printf("\33[1m\33[34m .%s\33[0m\n",rPath);
                    /*不处理 .和..和.开头的文件 */
                    if(dirAttribute->d_name[0]=='.'){
                        continue;
                    }
                    // 获取要创建的文件夹 准确路径
                    char toCreateFN[256];
                    strcpy(toCreateFN,pasteDir);
                    strcat(toCreateFN,rPath);
                    // 相对文件夹不存在则创建文件夹
                    if (access(toCreateFN, 0) == -1)
                    {
                        mkdir(toCreateFN,0755);
                    }
                    pthread_t tid;
                    three_para * ps = malloc(sizeof(three_para));
                    char ls_nextDir[256] ;//下一级要列出的目录
                    strcat(strcpy(ls_nextDir,lsDir),"/");
                    strcat(ls_nextDir,dirAttribute->d_name);
                    ps->para1 ="-al";
                    ps->para2 = ls_nextDir;
                    ps->para3 = fparas->para3;
                    // 调用myls线程
                    pthread_create(&tid,NULL,(void *) myls,ps);
                    pthread_join(tid,NULL);
                    free(ps);
                }
                // 非目录文件
                else 
                {
                    /*
                    // 如果不是目录文件，而且还具有可执行权限
                    if ((S_IXUSR&stateAttribute.st_mode)==S_IXUSR && 8==dirAttribute->d_type)
                    {
                        printf("\33[1m\33[32m %s\33[0m\n",dirAttribute->d_name);
                    }
                    // 普通文件，非可执行文件
                    else
                    {
                       printf(" \33[0m%s\n",dirAttribute->d_name);
                    }
                    */
                    // ***************对于 非目录文件执行mycp线程****************//
                    printf(" \33[0m.%s\n",rPath);
                    pthread_t tid;
                    fparas->para1 = filepath;
                    char pasteP[256];
                    strcpy(pasteP,pasteDir);
                    strcat(pasteP,rPath);
                    fparas->para2 = pasteP;

                    pthread_create(&tid,NULL,(void *) mycp,fparas);
                    pthread_join(tid,NULL);
                }

            }
        }
    }
    
    //关闭打开的文件
    int flag_closeDir=-1;
    flag_closeDir=closedir(openDir);
    if (flag_closeDir!=0)
    {
        printf("failed to close dir file \"%s\"！\n",lsDir);
        return(1);
    }
    
    // free(buf_dir);//用完了，手动释放缓存空间
    return 0;
}